import Docxtemplater from "docxtemplater";
import PizZip from "pizzip";
import PizZipUtils from "pizzip/utils/index.js";
import { saveAs } from "file-saver";

// 单纯导出word
export const exportWordDocx = (json, wordUrl, fileName) => {
  
  // 读取并获得模板文件的二进制内容
  function loadFile(url, callback) {
    PizZipUtils.getBinaryContent(url, callback);
  }

  // demo.docx是模板。我们在导出的时候，会根据此模板来导出对应的数据
  loadFile(wordUrl, function (error, content) {
    // 抛出异常
    if (error) {
      throw error;
    }

    // 创建一个JSZip实例，内容为模板的内容
    var zip = new PizZip(content);
    // 创建并加载docxtemplater实例对象
    var doc = new Docxtemplater().loadZip(zip);
    // 设置模板变量的值
    doc.setData(json);
    try {
      // 用模板变量的值替换所有模板变量
      doc.render();
    } catch (error) {
    }
if(json.type=='3'||json.type=='4'){
  const csvContent = `<p>用户消息: ${json.userVal}</p>
  <p>AI回复： ${json.AIVal}</p>`;
  var out = new Blob([csvContent], {type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document"});
  // 生成一个代表docxtemplater对象的zip文件（不是一个真实的文件，而是在内存中的表示）
  // var out = doc.getZip().generate({
//   type: "blob",
//   mimeType:
//     "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
// });
// 将目标文件对象保存为目标类型的文件，并命名
saveAs(out, fileName + ".docx");

}
  });
};
// 单纯导出word带图片

export const exportWordDocxWithImg = (json, wordUrl, fileName, imgSize) => {
  //这里要引入处理图片的插件
  var ImageModule = require("docxtemplater-image-module-free");
  const expressions = require("angular-expressions");
  // 读取并获得模板文件的二进制内容
  // demo.docx是模板。我们在导出的时候，会根据此模板来导出对应的数据
  // 读取并获得模板文件的二进制内容
  function loadFile(url, callback) {
    PizZipUtils.getBinaryContent(url, callback);
  }
  // demo.docx是模板。我们在导出的时候，会根据此模板来导出对应的数据
  loadFile(wordUrl, function (error, content) {
    // 抛出异常
    if (error) {
      throw error;
    }
    expressions.filters.size = function (input, width, height) {
      return {
        data: input,
        size: [width, height],
      };
    };
    // 图片处理
    let opts = {};
    opts = {
      //图像是否居中
      centered: true,
    };

    opts.getImage = (chartId) => {
      //console.log(chartId);//base64数据
      //将base64的数据转为ArrayBuffer
      return base64DataURLToArrayBuffer(chartId);
    };

    opts.getSize = function (img, tagValue, tagName) {
      //自定义指定图像大小
      if (imgSize) {
        return imgSize;
      } else {
        return [500, 500];
      }
    };
    // 创建一个JSZip实例，内容为模板的内容
    var zip = new PizZip(content);
    // 创建并加载docxtemplater实例对象
    let doc = new Docxtemplater();
    doc.attachModule(new ImageModule(opts));
    doc.loadZip(zip);
    // 设置模板变量的值
    doc.setData(json);
    try {
      // 用模板变量的值替换所有模板变量
      doc.render();
      
    } catch (error) {
      throw error;
    }
    if(json.type=='1'){
      const csvContent = `<h1 style="
        color: #333333;
        text-align: center;
        font-weight: bold;
        font-size: 18px;
        margin-top: 20px;
      "
    >
      值班重要情况报告表
    </h1>
    <div style=" margin:0 auto; text-align: center;">
      <table
      style="width: 50%; border-collapse: collapse;"
    >
      <tr>
        <td style="border: 1px solid black;text-align: center;">报告单位</td>
        <td style="border: 1px solid black;style="text-align: left;"">${json.userUnit}</td>
        <td style="border: 1px solid black;text-align: center; ">事发单位</td>
        <td style=" width:20%;border: 1px solid black;style="text-align: left;">${json.companyName}</td>
      </tr>
      <tr>
        <td style="border: 1px solid black;text-align: center;">报&nbsp;告&nbsp;人</td>
        <td style="border: 1px solid black;style="text-align: left;"">${json.nickname}</td>
        <td style="border: 1px solid black;text-align: center;">签&nbsp;发&nbsp;人</td>
        <td style="width:20%;border: 1px solid black;style="text-align: left;">${json.signName}</td>
      </tr>
      <tr style="border: 1px solid black">
        <td style="border: 1px solid black;text-align: center;" colspan="1">情况类别</td>
        <td style="text-align: left;" colspan="3">${json.twoSituationLabel}</td>
      </tr>
      <tr style="border: 1px solid black">
        <td style="border: 1px solid black;text-align: center;" colspan="1">情况内容</td>
        <td style="text-align: left;" colspan="3">${json.content}</td>
      </tr>
      <tr style="border: 1px solid black">
        <td style="border: 1px solid black;;text-align: center;" colspan="1">处置措施</td>
        <td style="text-align: left;" colspan="3">${json.desc}</td>
      </tr>
      <tr style="border: 1px solid black">
        <td style="border: 1px solid black;text-align: center;" colspan="1">请示事项</td>
        <td style="text-align: left;" colspan="3">${json.planList}</td>
      </tr>
      <tr style="border: 1px solid black">
        <td style="border: 1px solid black;text-align: center;" colspan="1">备注</td>
        <td style="text-align: left;" colspan="3">${json.remark}</td>
      </tr>
    </table>
       <div>
      <span>联系人:</span>
      <span>${json.issuer}</span>
      <span>电话:</span>
      <span>${json.telephone}</span>
    </div>
    </div>
      <h1 style="
        color: #333333;
        text-align: center;
        font-weight: bold;
        font-size: 18px;
        margin-top: 20px;
      "
    >
    值班重要情况态势图
    </h1>
    <div style="
       margin:0 auto;
         text-align: center;
      ">
       <img   width='500'  src="${json.imgUrl}" alt="" />  
    </div>
    
    `;

    // 生成一个代表docxtemplater对象的zip文件（不是一个真实的文件，而是在内存中的表示）
    var out = new Blob([csvContent], {type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document"});
    // 将目标文件对象保存为目标类型的文件，并命名
    saveAs(out, fileName + ".docx");
    }else{
      // 生成一个代表docxtemplater对象的zip文件（不是一个真实的文件，而是在内存中的表示）
      var out = doc.getZip().generate({
        type: "blob",
        mimeType:
          "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
      });
      // 将目标文件对象保存为目标类型的文件，并命名
      saveAs(out, fileName + ".docx");

    }
  });
};

/**
 * 将base64格式的数据转为ArrayBuffer
 * @param {Object} dataURL base64格式的数据
 */
function base64DataURLToArrayBuffer(dataURL) {
  const base64Regex = /^data:image\/(png|jpg|jpeg|svg|svg\+xml);base64,/;
  if (!base64Regex.test(dataURL)) {
    return false;
  }
  const stringBase64 = dataURL.replace(base64Regex, "");
  let binaryString;
  if (typeof window !== "undefined") {
    binaryString = window.atob(stringBase64);
  } else {
    binaryString = new Buffer(stringBase64, "base64").toString("binary");
  }
  const len = binaryString.length;
  const bytes = new Uint8Array(len);
  for (let i = 0; i < len; i++) {
    const ascii = binaryString.charCodeAt(i);
    bytes[i] = ascii;
  }
  return bytes.buffer;
}

